//
// Created by LiuYou on 2021/5/19.
//

#include <cstdlib>
#include <unistd.h>
#include <cstdio>

/*
 * fork函数使用
 */
int main() {
    std::printf( "[%d]:Begin!\n", getpid());

    // TODO 注意: 在fork之前刷新一切成功打开的流！！！！！
    //  非常重要！！！！
    //  如果父进程在执行 fork();函数 时没有刷新打开的流。那么fork();函数调用结束后的子进程也会复制一份父进程成功打开的流。
    //  然后如果父进程打开的流如标准输出流, 如果使用 printf(); 输出内容到缓冲区当中, 还没有来的及写到文件当中, 父进程调用了 fork()函数
    //  这样造成的结果就是父子进程缓冲区当中各自有 这个printf();输出内容 。
    std::fflush( nullptr );
    pid_t pid = fork();
    if (pid < 0) {
        std::perror( "fork()" );
        std::exit( 1 );
    } else if (pid == 0) {
        // child process
        std::printf( "[%d]:子进程创建成功。\n", getpid());
    } else {
        // parent process

//        getchar();

//        sleep(1);

        std::printf( "[%d]:父进程在工作。\n", getpid());
    }

    std::printf( "[%d]:End!\n", getpid());

    // TODO 注意: 运行的结果可能是子进程先打印输出, 然后是父进程打印输出。
    //  也有可能是父进程先打印输出, 然后是子进程打印输出。
    //  永远不要凭空猜测父子进程谁先被cpu调度！！！！
    //  假设我就是想要子进程先运行, 那就可以使用sleep(1);让父进程等待一会儿。
    //  这样的话那就一定是child先运行, 然后是parent后运行。
    //  但是让父进程或子进程谁先运行有其它更好的办法, 并不推荐使用sleep。
    //  sleep();函数有移植性问题。


//    std::getchar();


    std::exit( 0 );
}